package dao;

import model.ExpressCompany;
import model.User;
import util.*;

import java.sql.SQLException;
import java.util.List;

public class ExpressCompanyManager implements ExpressCompanyManagement {

    /**
     * 增加一个快递公司
     * @param expressCompany 包含快递公司的对象。id为数据库自增字段，设定的值将被忽略
     * @return 该公司在数据库中的id, 失败将返回null
     */
    @Override
    public Integer saveOne(ExpressCompany expressCompany) {
        if(expressCompany == null  || Common.isStringEmpty(expressCompany.getExp_com_name())) return null;
        try {
            JDBCConnection conn = JDBCFactory.takeJDBC();
            Integer expComID = (Integer) conn.updateForGeneratedKey("insert into t_exp_companys values(null, ?)", expressCompany.getExp_com_name());
            JDBCFactory.returnBack(conn);
            return expComID;
        } catch(SQLException e) {
            System.err.println(e.getMessage());
            return null;
        }
    }

    /**
     * 更改一个快递公司
     * @param expressCompany 包含快递公司修改信息的对象。id与公司名不能都为空
     * @return 修改成功返回true，否则返回false
     */
    @Override
    public boolean updateOne(ExpressCompany expressCompany, ExpressCompany desti) {
        if(expressCompany == null  ||  expressCompany.getExp_com_id() == null && Common.isStringEmpty(expressCompany.getExp_com_name())  ||
             desti == null  ||  Common.isStringEmpty(desti.getExp_com_name())) return false;

        String sql_whereCondition = null;
        Object arg_whereCondition = null;

        if(expressCompany.getExp_com_id() != null)
        {
            sql_whereCondition = " where exp_com_id = ?";
            arg_whereCondition = expressCompany.getExp_com_id();
        } else {
            sql_whereCondition = " where exp_com_name = ?";
            arg_whereCondition = expressCompany.getExp_com_name();
        }
        try{
            JDBCConnection conn = JDBCFactory.takeJDBC();
            int count = conn.update("update t_exp_companys set exp_com_name = ?" + sql_whereCondition, desti.getExp_com_name(), arg_whereCondition);
            JDBCFactory.returnBack(conn);
            return count == 1;
        } catch(SQLException e) {
            System.err.println(e.getMessage());
            return false;
        }
    }

    /***
     * 删除快递公司
     * @param expressCompany 要解约的快递公司
     * @return 解约的快递员用户人数
     */
    @Override
    public int deleteOneFast(ExpressCompany expressCompany, UsrTypeManager typeManager) {
        if(expressCompany == null  ||  expressCompany.getExp_com_id() == null && Common.isStringEmpty(expressCompany.getExp_com_name())) return 0;

        Integer comID = null;
        try {
            //从连接池获取一个数据库连接
            JDBCConnection conn = JDBCFactory.takeJDBC();
            //开启事务
            conn.start();

            //若不知道快递公司的id，按快递公司名称获取id
            if((comID = expressCompany.getExp_com_id()) == null)
            {
                List<Object[]> tmp = conn.query("select exp_com_id from t_exp_companys where exp_com_name = ?", expressCompany.getExp_com_name());

                //未找到该名称的快递公司
                if(tmp.size() == 0) {
                    //回滚事务
                    conn.rollback();
                    //归还连接
                    JDBCFactory.returnBack(conn);
                    return 0;
                }
                comID = (Integer) JDBCConnection.getGeneratedKey(tmp);
            }

            Long utypId = typeManager.getUserType(conn, "快递负责人", "派送订单的快递负责人用户");

            //查询该快递公司下的所有快递员的id
            List<Object[]> expSenderIds = conn.query("select u_id from t_exp_senders where exp_com_id = ?", comID);
            //解除该快递公司下属全部快递员用户的快递员身份
            conn.preparedUpdateBatch("delete from t_usertype where u_id = ? and utyp_id = ?");
            for(Object[] row : expSenderIds) conn.addUpdateBatch(row[0], utypId);
            conn.submitUpdateBatch();
            //删除该公司下属全部快递员
            conn.update("delete from t_exp_senders where exp_com_id = ?", comID);
            //删除快递公司
            conn.update("delete from t_exp_companys where exp_com_id = ?", comID);

            //提交事务
            conn.commit();
            //归还连接
            JDBCFactory.returnBack(conn);
            return comID;
        } catch(SQLException e) {
            System.err.println(e.getMessage());
            return 0;
        }
    }

    /***
     * 删除快递公司
     * @param expressCompany 要解约的快递公司
     * @return 解约的快递员用户详细信息列表
     */
    @Override
    public List<User> deleteOneReturnSenders(ExpressCompany expressCompany, UsrTypeManager typeManager) {
        if(expressCompany == null  ||  expressCompany.getExp_com_id() == null && Common.isStringEmpty(expressCompany.getExp_com_name())) return null;

        Integer comID = null;
        try{
            //从连接池获取一个数据库连接
            JDBCConnection conn = JDBCFactory.takeJDBC();
            //开启事务
            conn.start();

            //若不知道快递公司的id，按快递公司名称获取id
            if((comID = expressCompany.getExp_com_id()) == null)
            {
                List<Object[]> tmp = conn.query("select exp_com_id from t_exp_companys where exp_com_name = ?", expressCompany.getExp_com_name());

                //未找到该名称的快递公司
                if(tmp.size() == 0) {
                    //回滚事务
                    conn.rollback();
                    //归还连接
                    JDBCFactory.returnBack(conn);
                    return null;
                }
                comID = (Integer) JDBCConnection.getGeneratedKey(tmp);
            }

            Long utypId = typeManager.getUserType(conn, "快递负责人", "派送订单的快递负责人用户");

            //删除该快递公司下的所有快递员
            List<Object[]> expSenderIds = conn.query("select u_id from t_exp_senders where exp_com_id = ?", comID);
            conn.update("delete from t_exp_senders where exp_com_id = ?", comID);
            List<User> expSenderInfo = new ResultList<>();

            conn.preparedUpdateBatch("delete from t_usertype where u_id = ? and utyp_id = ?");
            for(Object[] row : expSenderIds)
            {
                expSenderInfo.add(
                        new User(
                                conn.query("select * from t_users where u_id = ?", row[0]).get(0)
                        )
                );
                conn.addUpdateBatch(row[0], utypId);
                //conn.update("delete from t_usertype where u_id = ? and utyp_id = ?", row[0], utypId);
            }
            conn.submitUpdateBatch();
            //删除快递公司
            conn.update("delete from t_exp_companys where exp_com_id = ?", comID);

            //提交事务
            conn.commit();
            //归还连接
            JDBCFactory.returnBack(conn);
            return expSenderInfo;
        } catch(SQLException e) {
            System.err.println(e.getMessage());
            return null;
        }
    }

    public static void main(String[] args) {
        ExpressCompany com = new ExpressCompany();
        com.setExp_com_id(10014);

        System.out.println(new ExpressCompanyManager().deleteOneReturnSenders(com, new UsrTypeManager()));
    }

    /**
     * 查询快递公司
     * @param com 包含快递公司信息的对象，为设定的参数视为全部匹配。若不设任何参数或传入null，将返回全部查询结果
     * @param pageSize 分页查询 —— 每页最大记录条数，若传入0则不分页
     * @param page 分页查询 —— 当前页码，若传入0则不分页
     * @return 查询到的公司列表，是LinkedList型
     */
    @Override
    public List<ExpressCompany> query(ExpressCompany com, int pageSize, int page) {
        boolean firstCondition = true;

        StringBuilder sql = new StringBuilder("select * from t_exp_companys");
        ArgsList<Object> arg_whereCondition = new ArgsList<>();

        //构造条件
        if(com != null)
        {
            if(com.getExp_com_id() != null)
            {
                sql.append(" where exp_com_id = ?");
                arg_whereCondition.add(com.getExp_com_id());
                firstCondition = false;
            }

            if(!Common.isStringEmpty(com.getExp_com_name()))
            {
                if(!firstCondition) sql.append(" and");
                sql.append(" where exp_com_name = ?");
                arg_whereCondition.add(com.getExp_com_name());
            }
        }

        if(pageSize > 0  &&  page > 0)
        {
            sql.append(" limit ?, ?");
            arg_whereCondition.add((Integer)((page - 1) * pageSize));
            arg_whereCondition.add((Integer)pageSize);
        }
        try {
            JDBCConnection conn = JDBCFactory.takeJDBC();
            List<ExpressCompany> result = getResultList(conn.query(arg_whereCondition, sql.toString()));
            JDBCFactory.returnBack(conn);
            return result;
        } catch(SQLException e) {
            System.err.println(e.getMessage());
            return null;
        }
    }

    @Override
    public List<ExpressCompany> query(ExpressCompany com) {
        return query(com, 0, 0);
    }
    @Override
    public List<ExpressCompany> query(int pageSize, int page) {
        return query(null, pageSize, page);
    }
    @Override
    public List<ExpressCompany> query() {
        return query(null);
    }
    @Override
    public List<ExpressCompany> queryALL() {
        return query();
    }
    @Override
    public List<ExpressCompany> queryALL(int pageSize, int page) {
        return query(pageSize, page);
    }

    /**
     * 包装并返回查询到的对象的列表
     * @param list 包含 SQL 行查询结果的列表，Object[]中每一项都是一列的值
     * @return 返回包装好的对象列表
     */
    private static List<ExpressCompany> getResultList(List<Object[]> list)
    {
        ExpressCompany com = null;

        List<ExpressCompany> result = new ResultList<>();

        for(Object[] row : list)
        {
            com = new ExpressCompany();

            com.setExp_com_id((Integer) row[0]);
            com.setExp_com_name((String) row[1]);

            result.add(com);
        }
        return result;
    }
}
